// 版权所有2009 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package syscall

const _SYS_setgroups = SYS_SETGROUPS

// sys-Dup2（oldf-int，newfd-int）（错误）
// sysnb-EpollCreate（size-int）（fd-int，error）
// sys-Fchown（fd-int，uid-int，gid-int）（错误）
// sys Listen（s int，n int）（error）
// sys Pause（）（error error）
// sys Pread（fd int，p[]byte，offset int64）（n int，error error）=sys PREAD64 
// sys Seek（fd int，offset int64，whence int）（off int64，err error）=sys_LSEEK 
// sys Select（nfd int，r*FdSet，w*FdSet，w*FdSet，e*FdSet，timeout*Timeval）（n int，err error）
// sysnb Setrlimit（resource int，rlim*Rlimit）（error）
// sys Shutdown（fd int，how int）（error）
// sys Splice（rfd int，roff*int64，wfd int，woff*int64，len int，flags int）（n int64，error）
// sys Statfs（path string，buf*Statfs_t）（error）
// sys Truncate（path string，length int64）（error error）
// sys Ustat（dev int，ubuf*Ustat_t）（error error）
// sys accept（s int，rsa*RawSockaddrAny，addrany，addrlen*_Socklen*)Socklen）（fd int，error）
// sys connect（s int，addr unsafe.Pointer，addrlen _Socklen）（error error）
// sys fstatat（fd int，path string，stat*stat__t，flags int）（error error）=sys NEWFSTATAT 
// sysnb getgroups（n int，list*_Gid___t）（nn int，error）
// sys setsockopt（s int，level int，name int，val unsafe.Pointer，vallen uintptpr）（错误）
// sysnb socket（域int，类型int，proto int）（fd int，错误）
// sysnb socketpair（域int，类型int，proto int，fd*[2]int32）（错误）
// sysnb getsockname（fd int，rsa*RawSockaddrAny，addrlen*_Socklen）（error）
// sys recvfrom（fd int，p[]byte，flags int，from*RawSockaddrAny，fromlen*_Socklen）（n int，error）
// sys sendto（s int，buf[]byte，flags int，flags int，to unsafe.Pointer，abdrop，addrlen）
// sys sendmsg（s int，msg*Msghdr，flags int）（n int，error error）
// sys mmap（addr uintpttr，length uintpttr，prot int，flags int，fd int，offset int64）（xaddr uintptpr，error）

func Stat(path string, stat *Stat_t) (err error) {
	return fstatat(_AT_FDCWD, path, stat, 0)
}

func Lchown(path string, uid int, gid int) (err error) {
	return Fchownat(_AT_FDCWD, path, uid, gid, _AT_SYMLINK_NOFOLLOW)
}

func Lstat(path string, stat *Stat_t) (err error) {
	return fstatat(_AT_FDCWD, path, stat, _AT_SYMLINK_NOFOLLOW)
}

// sys futimesat（dirfd int，path string，times*[2]Timeval）（错误）

// go:noescape 
func gettimeofday(tv *Timeval) (err Errno)

func Gettimeofday(tv *Timeval) (err error) {
	errno := gettimeofday(tv)
	if errno != 0 {
		return errno
	}
	return nil
}

func Time(t *Time_t) (tt Time_t, err error) {
	var tv Timeval
	errno := gettimeofday(&tv)
	if errno != 0 {
		return 0, errno
	}
	if t != nil {
		*t = Time_t(tv.Sec)
	}
	return Time_t(tv.Sec), nil
}

// sys Utime（path string，buf*Utimbuf）（错误）
// sys utimes（path string，times*[2]Timeval）（错误）

func setTimespec(sec, nsec int64) Timespec {
	return Timespec{Sec: sec, Nsec: nsec}
}

func setTimeval(sec, usec int64) Timeval {
	return Timeval{Sec: sec, Usec: usec}
}

func (r *PtraceRegs) PC() uint64 { return r.Rip }

func (r *PtraceRegs) SetPC(pc uint64) { r.Rip = pc }

func (iov *Iovec) SetLen(length int) {
	iov.Len = uint64(length)
}

func (msghdr *Msghdr) SetControllen(length int) {
	msghdr.Controllen = uint64(length)
}

func (cmsg *Cmsghdr) SetLen(length int) {
	cmsg.Len = uint64(length)
}

func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno)
